home *** CD-ROM | disk | FTP | other *** search
- ; This is a modified version of a routine from SDIR Version
- ; 2.4, by Ted Reuss (modified from a program by John Chapman), on
- ; PC-SIG Volume 185.
-
- .XLIST
- INCLUDE ASCII.DEF
- INCLUDE MSDOS2.DEF
- .LIST
-
- PUBLIC PRINTDD
-
- CODE SEGMENT BYTE PUBLIC
- ASSUME CS:CODE
- SUBTTL PRINTDD - PRINT A DOUBLE WORD IN DI:SI
- PAGE
- LDZERO: DB 1 DUP (?)
- DOUBLE: DB 8 DUP (20H)
- DB '$'
- DBLCNT: DW 1 DUP (?)
-
- PRINTDD PROC NEAR ;Prints a 32 bit integer in DI:SI
- ;AL = 0 to suppress leading 0's
- ; = "0" (60Q) to print leading 0's
- ; = " " (20Q) to print leading spaces
- PUSH DS
- PUSH AX
- MOV AX,CODE
- MOV DS,AX ;MAKE DATA SEG POINT TO CODE
- POP AX
- MOV BYTE PTR CODE:LDZERO,AL
- CALL PRINTDX ;format the double word into DOUBLE 2.4
- MOV DX,OFFSET CODE:DOUBLE
- MOV BX,DX
- MOV CX,7 ;SUPPRESS LEADING 0'S
- SUPP0: MOV AL,[BX]
- CMP AL,SPACE
- JNE SPDONE
- MOV AL,BYTE PTR CODE:LDZERO
- CMP AL,0
- JNE SUPP1
- INC DX
- JMP SHORT SUPP2
- SUPP1:
- MOV [BX],AL
- SUPP2:
- INC BX
- LOOP SUPP0
- SPDONE:
- MOV AH,CON_STRING_OUTPUT
- INT DOS ;print the digits 2.4
- POP DS ;RESTORE DATA SEG
- RET ;and return 2.4
- PRINTDD ENDP ; 2.4
-
- PRINTDX PROC NEAR ;converts integer in DI:SI to decimal 2.4
- MOV WORD PTR CODE:DBLCNT,0 ;reset the offset for DOUBLE 2.4
- XOR AX,AX ;Zero out the 2.4
- MOV BX,AX ; working
- MOV BP,AX ; registers.
- MOV CX,32 ;# bits of precision
- J1: SHL SI,1
- RCL DI,1
- XCHG BP,AX
- CALL J6
- XCHG BP,AX
- XCHG BX,AX
- CALL J6
- XCHG BX,AX
- ADC AL,0
- LOOP J1
- MOV CX,1710H ;5904 ?
- MOV AX,BX
- CALL J2
- MOV AX,BP
- J2: PUSH AX
- MOV DL,AH
- CALL J3
- POP DX
- J3: MOV DH,DL
- SHR DL,1 ;Move high
- SHR DL,1 ; nibble to
- SHR DL,1 ; the low
- SHR DL,1 ; position.
- CALL J4
- MOV DL,DH
- J4: AND DL,0FH ;Mask low nibble
- JZ J5 ;If not zero
- MOV CL,0
- J5: DEC CH
- AND CL,CH
- OR DL,'0' ;Fold in ASCII zero
- SUB DL,CL
- PUSH DI ;save DI 2.4
- MOV DI,OFFSET CODE:DOUBLE ;point to DOUBLE 2.4
- ADD DI,WORD PTR CODE:DBLCNT ;add current offset 2.4
- INC WORD PTR CODE:DBLCNT ;bump offset for next time 2.4
- MOV BYTE PTR DS:[DI],DL ;move next digit to DOUBLE 2.4
- POP DI ;restore DI 2.4
- RET ;Exit to caller
- PRINTDX ENDP ; 2.4
-
- J6 PROC NEAR
- ADC AL,AL
- DAA
- XCHG AL,AH
- ADC AL,AL
- DAA
- XCHG AL,AH
- RET
- J6 ENDP
-
- CODE ENDS
- END
-